/**
 * 实现思路：
 * data: {message: 'Hello'} 修改为 {message: 'Bye'} 时候
 * 将<input v-model="message"></input> 的 input.value 马上修改为最新的message
 */

//监听器 将模板编译和数据劫持联系起来
class Watcher {
  /**
   * 
   * @param {*} vm 实例
   * @param {*} exp 标签属性上面的表达式
   * @param {*} cb 回调函数
   */
  constructor(vm, exp, cb) {
    this.vm = vm;
    this.exp = exp;

    //一旦数据发送变更，执行回调函数
    this.cb = cb;

    // 获取旧的值
    this.value = this.get();
  }

  get() {
    Dep.target = this;

    let value = this.getValue(this.vm, this.exp);
    // console.log(value);
    //Hello world!

    Dep.target = null;
    return value;
  }

  //获取值 message.a
  getValue(vm, exp) {
    exp = exp.split('.');
    return exp.reduce((prev, next) => {
      return prev[next];
    }, vm.$data);
  }

  //更新数据
  update() {
    let newValue = this.getValue(this.vm, this.exp);
    let oldValue = this.value;

    if (newValue !== oldValue) {
      this.cb(newValue);
    }
  }
}